#include <stdio.h>   /* */
#include <stdlib.h>  /* exit() */
#include <string.h>  /* memset(), memcpy() */
#include <sys/utsname.h>   /* uname() */
#include <sys/types.h>
#include <sys/socket.h>   /* socket(), bind(),
                             listen(), accept() */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>  /* fork(), write(), close() */

//TP1 Tomas Gutierrez, Nicolas Kappes, Dario Lamy.

int main(int argc,char **argv,char **envp) {

	const char *DEFAULT_ADDRESS="127.0.0.1";
	const int DEFAULT_PORT=8080;

	int i;

	char *host;
	char respuesta[256];
	int port;
	struct Consulta{
		int alumno;
		int nota;
	} consulta;

	int consultaSerializada[2]; //Usamos esta para enviar en lugar del struct.

	struct sockaddr_in direccion;
	int s; //Socket

	//Valores por defecto.
	strcpy(host, DEFAULT_ADDRESS); //Cargar IP por defecto.
	port=0;
	consulta.alumno=-1;
	consulta.nota=-1; //Si no se pasó un parámetro nota, envía -1 para una operación de consulta.

	for(i=1 ; i<argc ; i+=2){
		if(strcmp("-h", argv[i])==0){
			host=argv[i+1]; //Esto probablemente tenga que hacerse con strcpy, pero así funciona.
		}else if(strcmp("-p", argv[i])==0){
			port=atoi(argv[i+1]);
		}else if(strcmp("-a", argv[i])==0){
			consulta.alumno=atoi(argv[i+1]);
		}else if(strcmp("-n", argv[i])==0){
			consulta.nota=atoi(argv[i+1]);
		}else{
			//Retornar error, mal el comando.
			printf("Error interpretando argumentos.\nDisponibles:\n-h <host>\n-p <puerto>\n-a <lu_alumno>\n-n <nota>\n");
			return -1;
		}
	}

	if(consulta.alumno==-1){
		//Alumno nulo, nada para hacer.
		printf("Se necesita un parametro -a <lu_alumno>\n");
		return -1;
	}

	if(port==0){ //La idea es setear un puerto por defecto en caso de no haber parametrizado ninguno.
		port=DEFAULT_PORT;
	}

	direccion.sin_family = AF_INET;
	direccion.sin_port = htons(port);
	inet_aton(host, &direccion.sin_addr);

	//Serializar consulta.
	bzero(consultaSerializada,2);
	consultaSerializada[0]=consulta.alumno;
	consultaSerializada[1]=consulta.nota;
	
	s = socket(PF_INET, SOCK_STREAM, 0);
	printf("Conectando...\n");
	if(connect(s, (struct sockaddr*)&direccion, sizeof(direccion))==-1){
		//Error conectando.
		printf("Error conectando con el servidor.\n");
		return -1;
	}

	printf("Conectado!\n");

	//Enviar.
	write(s, &consultaSerializada, sizeof(int)*2); //Investigar que retorna;

	//Recibir.
	while(read(s, &respuesta, sizeof(char)*256)>0){ //Deja de leer cuando el servidor cierra la conexión.
		//Imprimir respuesta.
		printf("%s", respuesta);
		break;
	}
	
	close(s);
	
	return 0;
}

